#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

// 错误码

void myperror(const char *str)
{
    fprintf(stderr,"%s:%s\n",str,strerror(errno));
}

int main()
{
    for(int i=0;i<150;i++)
    {
        printf("%s\n",strerror(i));
    }
    
    return 0;
}

//// 理清stdout 和 stderr
//
//// ./myfile > log.txt 2> err.txt
//// ./myfile > test.txt 2>&1
//int main()
//{
//    fprintf(stdout,"fprintf 1\n");
//    fprintf(stderr,"fprintf 2\n");
//    
//
//    const char *s1="write 1\n";
//    const char *s2="write 2\n";
//    
//    write(1,s1,strlen(s1));
//    write(2,s2,strlen(s2));
//
//    std::cout<<"cout 1"<<std::endl;
//    std::cerr<<"cerr 2"<<std::endl;
//
//    return 0;
//}
//

//// 验证用户级缓冲区是语言级别的东西
///*
// *当在打开一个文件之前，先关闭文件描述符为1的显示器之后，再来打开一个文件
// *根据文件描述符分配规则，该文件对应的文件描述符为1
// *所以往log.txt 也就是往磁盘上写入（用C标准库的输出接口）时
// *数据并不会立即往磁盘写入，而是会先将数据存入缓冲区，并且磁盘对应的缓冲区的刷新
// *策略是满刷新，也就是在缓冲区满之前数据不会立即刷入磁盘，除非进程退出（调用exit接口），文件关闭（fclose）
// *或者调用fflush接口才会将数据从缓冲区刷入磁盘。如果在该文件的缓冲区刷新之前，调用系统接口
// *close将对应的文件关闭，则该文件对应信息就会失效，之前写入缓冲区的数据就无法刷入磁盘文件了
// *因为close是系统调用，无法操作c标准库提供的缓冲区
// *而用系统调用write写入就不会出现上面的情况
// */
//int main()
//{
//
//    close(1); // 关闭显示器
//
//    int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
//    if(fd<0)
//    {
//        perror("open");
//        exit(1);
//    }
//
//    // stdout 记录的文件描述符永远是1
//    fprintf(stdout,"hello fptintf\n");
//    printf("hello printf\n");
//    fputs("hello fpust\n",stdout);
//
//    const char *s="hello write\n";
//
//    write(fd,s,strlen(s));
//
//    close(fd); // 关闭 log.txt
//
//    // 打开test.txt并且test.txt的文件描述符为1
//    // 之后就不关闭fd1 所以当main函数return 也就是进程退出
//    // stdout的缓冲区数据会刷入test.txt中
//    // 因为stdout的文件描述符记录着是1，也就是现在的test.txt
//    int fd1=open("test.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
//    if(fd1<0)
//    {
//        perror("open");
//        exit(1);
//    }
//
//
//    return 0;
//}
